# 操作数据库的类
import pymysql


class DB(object):

    def __init__(self, host="localhost", port=3306, user="root", password="root123", charset="utf8",
                 database="woniusales", cursortype="dict", **kwargs):
        """
        :param host: 数据库地址
        :param port: 数据库端口号
        :param user: 数据用户名
        :param password: 数据库密码
        :param charset: 操作字符集
        :param database: 指定数据库名
        :param cursortype: 游标类型，默认是dict-->字典，如果为tuple-->元祖
        :param kwargs: 连接数据库的额外参数
        """

        self.__db_info = {"host": host, "port": port, "user": user, "password": password, "charset": charset,
                          "database": database}
        self.__db_info.update(kwargs)  # 补充其他参数
        self.__cursortype = cursortype
        self.__connect()

        # 能连接默认数据
        # 创建游标

    def __connect(self):
        try:
            self.__cnn = pymysql.connect(**self.__db_info)
        except:
            print("数据库连接信息有错误",self.__db_info)

        try:
            if self.__cursortype == "dict":
                self.__cur = self.__cnn.cursor(pymysql.cursors.DictCursor)
            elif self.__cursortype == "tuple":
                self.__cur = self.__cnn.cursor()
        except:
            print("传入的cursortype参数错误！")


    def update(self, sql, sql_args=None):
        """
        修改数据
        :param sql: sql语句
        :param sql_args: sql语句的参数
        :return: 返回受印象的行数 （整数）
        """
        try:
            self.__cnn.begin()  # 开启事务
            rows = self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
            if rows < 1:
                print(f"Warnning: 受印象的行数是0，可能你的sql语句有错误。( slq:{sql},sql_args:{sql_args} )")
            self.__cnn.commit()  # 提交事务

        except:
            print("sql 语句错误",sql,sql_args)
        else:
            return rows

    def query(self, sql, sql_args=None):
        """
        :param sql:  查询语句
        :param sql_args:  查询语句的参数
        :return: 返回 （行数，列名，数据）
        """
        # 返回结果 【可以是列表（不要忘记高速我列名是什么），或  字典】
        try:
            rows = self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
            data = self.__cur.fetchall()
            fields = [i[0] for i in self.__cur.description]  # 列名
        except pymysql.err.OperationalError as e:
            print("sql 语句列名错误",e)
        except pymysql.err.ProgrammingError as e:
            print("sql 语句错误",e)
        except Exception as e:
            print('sql 执行中发生了错误',e)

        else:
            return rows, fields, data

    def __del__(self):
        """关闭游标，关闭连接"""
        try:
            self.__cur.close()
            self.__cnn.close()
        except:
            pass

def mytest():
    print("运行了mytest")

name="luoj"

if __name__ == '__main__':
    # 以后模块中的测试数据全部写在这个里面

    woniusales = DB(cursortype="dict")
    # users=woniusales.query("select * from user ")
    # print("用户有--->",users)

    result = woniusales.query("update user set realname='管理员' where userid=%s",(555,))
    print("结果-->", result)
    #pymysql.err.OperationalError  列名错了
    #pymysql.err.ProgrammingError  #
    #pymysql.err.ProgrammingError





